package co.edu.udea.iw.prestamodispositivos.dao.hibernate;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import co.edu.udea.iw.prestamodispositivos.dao.PrestamoDAO;
import co.edu.udea.iw.prestamodispositivos.dto.Dispositivo;
import co.edu.udea.iw.prestamodispositivos.dto.Prestamo;
import co.edu.udea.iw.prestamodispositivos.dto.Tipodisponibilidad;
import co.edu.udea.iw.prestamodispositivos.dto.Usuario;
import co.edu.udea.iw.prestamodispositivos.excepciones.IWBLException;
import co.edu.udea.iw.prestamodispositivos.excepciones.IWDAOException;


@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration(locations = "classpath:configuracion-spring.xml")
public class PrestamoDAOHibernateTest {
	@Autowired
	PrestamoDAO prestamoDAO;

	@Test
	public void testCreatePrestamo() {
		Usuario usuario = new Usuario();
		usuario.setContrasena("1234");
		usuario.setCorreoElectronico("juanmolinaflorez@gmail.com");
		usuario.setIdUsuario("555");
		usuario.setNombre("Juan Fernando Molina");
		usuario.setTelefono("2222222");
		usuario.setTipoUsuario("admin");
		
		Tipodisponibilidad tipodisponibilidad= new Tipodisponibilidad("Disponible");
		tipodisponibilidad.setIdTipoDisponibilidad(1);
		
		Dispositivo dispositivo = new Dispositivo(tipodisponibilidad, "Tablet", "Bueno");
		dispositivo.setIdDispositivo(1);
		
		Prestamo prestamo= new Prestamo(dispositivo, usuario, new Date(), new Date(), "Pendiente");
		
		
		try {
			prestamoDAO.createPrestamo(prestamo);
			System.out.println("El prestamo fue creado");
			assertTrue(true);
		} catch (IWBLException e) {
			e.printStackTrace();
			fail(e.getMessage());
		} catch (IWDAOException e) {
			e.printStackTrace();
			fail(e.getMessage());
		}
		
		
	}

	@Test
	public void testGetPrestamo() {
		int codigoPrestamo =1;
		
		try {
			Prestamo prestamo=prestamoDAO.getPrestamo(codigoPrestamo);
			if (prestamo!=null) {
				System.out.println("/*/*/*/*/*/*/*/*/*/*/**/");
				System.out.println("El prestamo ha sido recuperado");
				System.out.println(prestamo.getHoraFinal().toString());
			}
			assertTrue(true);
		} catch (IWBLException e) {
			e.printStackTrace();
			fail(e.getMessage());
		} catch (IWDAOException e) {
			
			e.printStackTrace();
			fail(e.getMessage());
		}
		
		
	}

	@Test
	public void testGetAllPrestamos() {
		
		try {
			List<Prestamo> prestamos= prestamoDAO.getAllPrestamos();
			if (prestamos.size()!=0) {
				for (Prestamo p:prestamos){
					System.out.println(p.getCodigoPrestamo());
				}
			}
		assertTrue(true);
		} catch (IWBLException e) {
			e.printStackTrace();
			fail(e.getMessage());
		} catch (IWDAOException e) {
			e.printStackTrace();
			fail(e.getMessage());
		}
	}

	@Test
	public void testGetAllPendingPrestamos() {
		
		try {
			List<Prestamo> prestamos= prestamoDAO.getAllPendingPrestamos();
			if (prestamos.size()!=0) {
				for (Prestamo p:prestamos){
					System.out.println(p.getCodigoPrestamo());
				}
			}
		assertTrue(true);
		} catch (IWBLException e) {
			e.printStackTrace();
			fail(e.getMessage());
		} catch (IWDAOException e) {
			
			e.printStackTrace();
			fail(e.getMessage());
		}
	}

	@Test
	public void testUpdatePrestamo() {
		Usuario usuario = new Usuario();
		usuario.setContrasena("1234");
		usuario.setCorreoElectronico("juanmolinaflorez@gmail.com");
		usuario.setIdUsuario("123");
		usuario.setNombre("Juan Fernando Molina");
		usuario.setTelefono("2222222");
		usuario.setTipoUsuario("admin");
		
		Tipodisponibilidad tipodisponibilidad= new Tipodisponibilidad("Disponible");
		tipodisponibilidad.setIdTipoDisponibilidad(1);
		
		Dispositivo dispositivo = new Dispositivo(tipodisponibilidad, "Tablet", "Bueno");
		dispositivo.setIdDispositivo(1);
		
		Prestamo prestamo= new Prestamo(dispositivo, usuario, new Date(), new Date(), "Negado");
		prestamo.setCodigoPrestamo(1);
		
		
		try {
			prestamoDAO.updatePrestamo(prestamo);
			System.out.println("El prestamo fue actualizado");
			assertTrue(true);
		} catch (IWBLException e) {
			e.printStackTrace();
			fail(e.getMessage());
		} catch (IWDAOException e) {
			e.printStackTrace();
			fail(e.getMessage());
		}
		
	}

	@Test
	public void testDeletePrestamo() {
		
		try {
			prestamoDAO.deletePrestamo(4);
			System.out.println("El prestamo fue eliminado");
			assertTrue(true);
		} catch (IWBLException e) {
			e.printStackTrace();
			fail(e.getMessage());
		} catch (IWDAOException e) {
			e.printStackTrace();
			fail(e.getMessage());
		}
		
	}

}
